미루고 미뤄왔던 GitLab 7.13.3을 10.x 버전의 최신으로 업그레이드를 시도했다. 기존에는 Docker에 GitLab 이미지와 MySQL이미지를 올려서 사용하고 있었다. 도커 이미지는 공식 이미지가 아닌 sameersbn의 이미지를 사용했었다. 어쨌든... 공식 이미지로 사용했다면 계속 업그레이드하고 사용했을텐데 그렇지 않았기 때문에 옴니버스 버전의 GitLab을 사용하려고 한다.

업그레이드 전에 GitLab 환경은

를 사용하고 있었다.

1. 백업 & 업그레이드

Docker 명령어를 이용해 기존 GitLab 저장소 등을 백업했다.

docker run --name gitlab -it --rm \
  --link gitlab-mysql:mysql --link gitlab-redis:redisio \
  --publish 22:22 --publish 9000:80 \
  --env-file /root/docker-env-files/env-gitlab.list \
  --volume /srv/docker/gitlab/gitlab:/home/git/data \
  sameersbn/gitlab:7.13.3 app:rake gitlab:backup:create

백업된 파일은 /srv/docker/gitlab/gitlab/backup 폴더에 생성됐다.

다음으로 옴니버스 GitLab 8.0 버전을 설치했고, 바로 restore 명령을 했...는데 되지 않는다!

2. 복구

GitLab 8.0.0 버전에서 바로 복구해서 사용하려고 했으나 실패했다. 로그 메세지는 7.13.3버전에서 백업한 것이니 7.13.3에서 복구하라는 내용이었다.

GitLab을 완전히 지운 후, yum을 이용해 7.13.3 버전을 다시 설치했다.

완전 삭제 관련 링크:

https://forum.gitlab.com/t/complete-uninstall-gitlab-ce-from-ubuntu-14/6232

새로 7.13.3을 설치 한 후에, 백업한 내용을 복구했다. 하지만 DB관련해서 모조리 에러가 났다. 왜냐하면 옴니버스 패키지는 DB를 PG를 사용하고 있기 때문이었다. 다행히 Docker에서 gitlab-mysql을 삭제하지 않아서 pgloader를 이용해 기존의 DB를 PG에 마이그레이션을 시도했다.

mysql to pg:

https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/update/mysql_to_postgresql.md

pgloader는 소스설치:

https://stackoverflow.com/questions/32902190/how-to-build-pgloader-on-windows-or-centos7?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

웹이 뜨질 않는다. nginx 에서 80포트로 계속해서 bind를 시도한 로그를 /var/log/gitlab/nginx에서 확인했다. 80포트와 8088, 8080포트를 현재 다른 웹 프로덕트에서 사용중에 있기 때문에 동일 포트를 사용할 수 없었다.

/var/opt/gitlab/gitlab-rails/etc/gitlab.yml 에서 80포트 8080포트와 관련된 포트를 모두 다른 포트로 수정해줬다.

GitLab 웹이 드디어 뜬다! 하지만 repositories들이 모두 empty로 나온다. 아무래도 MySQL을 PG로 마이그레이션 하면서 백업된 내용과 달라 생긴 이슈 같다. 복구 중에 MySQL 오류가 나면서 다음 절차에 있는 repository를 제대로 복구하지 못한 듯 하다.

3. 어떻게 하지?

https://gitlab.com/gitlab-org/omnibus-gitlab/issues/888

gitlab source to omnibus 로 검색을해서 나와 가장 상황이 유사한 글을 찾았다. 옴니버스 버전에서는 더 이상 MySQL을 지원하지 않는다고 한다. 다음과 같은 절차로 진행을 하라고 한다.

  1. 기존 Gitlab의 DB를 MySQL에서 PG로 마이그레이션 한다.
  2. PG로 마이그레이션 한 상태에서 백업한다.
  3. 동일한 버전(7.13.3)의 옴니버스를 인스톨한다.
  4. 백업파일을 복구하고 옴니버스의 GitLab을 업그레이드 한다.

결국 처음부터 다시 시작해야 한다...

4. 다시 전체 삭제

gitlab-ctl uninstall
gitlab-ctl cleanse
gitlab-ctl remove-accounts
yum remove gitlab-ce.x86\_64

5. Docker의 PG 설치

GitHub sameersbn/gitlab 저장소에서 7.13.3버전의 GitLab에 PG를 설치하고 MySQL 컨테이너에서 PG 컨테이너로 마이그레이션하고 다시 GitLab 백업하고 옴니버스 7.13.3에서 이를 복구하는 방법을 사용할 예정이다.

sammersbn/gitlab 7.13.3 저장소 README.md 문서(pg): https://github.com/sameersbn/docker-gitlab/tree/v7.13.3#postgresql

PG 도커 컨테이터를 올렸다. commands.load 파일을 신규로 생성했다.


LOAD DATABASE

FROM mysql://gitlab:<password>@172.17.0.3/gitlabhq\_production
INTO postgresql://gitlab:<password>@172.17.0.6/gitlabhq\_production
WITH include no drop, truncate, disable triggers, create no tables,
create no indexes, preserve index names, no foreign keys,
data only
ALTER SCHEMA 'gitlabhq\_production' RENAME TO 'public'

;

컨테이너의 mysql 접속 IP주소와 신규 pg IP주소는 docker inspect ` 명령어로 찾아내어 commands.load 파일을 새로 생성했다.

pgloader commands.load 명령어로 MySQL을 PG로 마이그레이션 한다. 그리고 GitLab을 PG에 마운트 시켜 올려보고 문제가 되지 않는다면, 백업을 진행하자.

pgloader commands.load 명령이 실패했다. gitlabhq_production 스키마를 public 이름으로 RENAME이 실패했다고 한다. gitlab을 postgress 기반으로 백업복구 없이 구동했다. 데이터는 없지만 DB SCHEMA를 생성할 거라고 생각해서다.

env-gitlab.list 파일의 DB 관련된 항목을 postgresql 로 변경했다. 그리고 컨테이너를 올렸다.

docker run --name gitlab -d \
  --link gitlab-postgresql:postgresql --link gitlab-redis:redisio \
  --publish 22:22 --publish 9000:80 \
  --env-file /root/docker-env-files/env-gitlab.list \
  --volume /srv/docker/gitlab/gitlab:/home/git/data \
  sameersbn/gitlab:7.13.3

그리고 다시 pgloader commands.load 명령으로 마이그레이트 수행했고 잘 오류 없이 마이그레이션이 잘 되었다. gitlab을 실행했더니 postgresql 기반으로 mysql을 사용하던 것과 동일하게 동작하는 것을 확인했다. 이제 마이그레이션은 다 됐다!

6. 다시 백업

이제 백업을 다시 수행하자. 옴니버스 버전으로 올리려면 그래야 한다.. 아래는 postgresql 기반의 gitlab을 백업하는 docker 명령

docker run --name gitlab -it --rm \
  --link gitlab-postgresql:postgresql --link gitlab-redis:redisio \
  --publish 22:22 --publish 9000:80 \
  --env-file /root/docker-env-files/env-gitlab.list \
  --volume /srv/docker/gitlab/gitlab:/home/git/data \
  sameersbn/gitlab:7.13.3 app:rake gitlab:backup:create

7. 옴니버스 7.13.3 설치

이 전에 RPM gitlab 공식 저장소를 추가했기 때문에 저장소 추가 명령은 건너뛰고 yum install 로 쉽게 설치할 수 있었다.

yum --nogpgcheck install gitlab-ce-7.13.3-ce.1.el7

설치 끝!

8. 옴니버스 버전 설정

/etc/gitlab/gitlab.rb 파일에서

external\_url, nginx['redirect_http_to_https_port'], ci_nginx['redirect_http_to_https_port']

HTTP 관련 포트설정을 원래 사용하던 포트로 변경했다. SSH 포트도 /etc/ssh/sshd_config 파일을 수정해서 설정했다.

이제 gitlab.rb 파일의 설정을 적용하자.

gitlab-ctl reconfigrue
gitlab-ctl stop
gitlab-ctl start

9. 데이터 복구

gitlab-rake gitlab:backup:restore BACKUP=1525940777 // 1525940777_gitlab_backup.tar 파일을 복구 파일로 사용

복구 완료!

10. 구동 확인

gitlab-ctl restart

기존 URL로 접속 화면 확인 완료! 기존 로컬저장소에서 리포트 저장소에 Fetch 시도했으나 오류가 난다. WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! SSH 리모트 호스트의 키가 변경되서 그렇다.

로컬 터미널에서

ssh-keygen -R <host IP>

명령으로 해결. (참고:https://cpuu.postype.com/post/30065)

gitlab-rake gitlab:check SANITIZE=true

명령으로 GitLab 자체 진단을 수행했으나 아래와 같은 오류가 났다.

Repo base access is drwxrws---? ... no
Try fixing it:
sudo chmod -R ug+rwX,o-rwx /var/opt/gitlab/git-data/repositories
sudo chmod -R ug-s /var/opt/gitlab/git-data/repositories
find /var/opt/gitlab/git-data/repositories -type d -print0 \| sudo xargs -0 chmod g+s
Try fixing it 에 나온 명령으로 해결. 하지만 여전히 오류가 남아있다.
hooks directories in repos are links: ...
13/3 ... rake aborted!
Errno::ENOENT: No such file or directory @ realpath\_rec - /home/git

이유를 찾았다! (참고: https://gitlab.com/gitlab-org/gitlab-ce/issues/899)

리모트 저장소에 hook이 예전 GitLab소스 버전(도커 이미지 내부가 소스설치로 되어 있다..당연히..)의 경로로 심볼릭 링크(/home/git/...)가 깨져서 그렇다. 아무래도 소스버전일때의 심볼릭링크를 그대로 백업을 했고 복구할때 그대(/home/git/..)로 적용되서 그런 듯 하다.

find /var/opt/gitlab/git-data/repositories -name \\*.git -type d -exec sh -c 'ln -sf /opt/gitlab/embedded/service/gitlab-shell/hooks $0' {} \;

명령으로 해결했다. 기존 심볼릭 링크의 주소를 변경한 것이다.

또 오류가 난다.

Projects have satellites? ...
13/3 ... no
Try fixing it:
sudo -u git -H bundle exec rake gitlab:satellites:create RAILS\_ENV=production
If necessary, remove the tmp/repo\_satellites directory ...
... and rerun the above command
For more information see:
doc/raketasks/maintenance.md
Please fix the error above and rerun the checks.

gitlab-rake gitlab:satellites:create RAILS\_ENV=production명령으로 해결했다. 로그에는 sudo -u git -H bundle exec rake 명령을 사용하라고 되어 있지만, 이를 gitlab-rake 명령으로 변경하면 된다(감으로 해결...).

모든 문제 해결!

11. 업그레이드

이제 처음에 계획했던 메이저 업그레이드를 진행해야 한다. 8.x, 9.x, 10.x, 그리고 최신버전으로 업그레이드를 수행하자.

gitlab-rake gitlab:backup:create
yum -y --nogpgcheck install gitlab-ce-8.0.0-ce.0.el7
gitlab-rake gitlab:check SANITIZE=true

yum -y --nogpgcheck install gitlab-ce-9.0.0-ce.0.el7
gitlab-ctl reconfigure
gitlab-rake gitlab:check SANITIZE=true

yum -y --nogpgcheck install gitlab-ce-10.0.0-ce.0.el7

10으로 업그레이드가 실패했다!

gitlab preinstall: Upgrade failed. Retry the upgrade after upgrading your PostgreSQL version.
오류: %pre\(gitlab-ce-10.0.0-ce.0.el7.x86\_64\) scriptlet failed, exit status 1
Error in PREIN scriptlet in rpm package gitlab-ce-10.0.0-ce.0.el7.x86\_64
gitlab-ce-9.0.0-ce.0.el7.x86\_64 was supposed to be removed but is not!

명령으로 pg 버전을 확인하니 오래되긴 했다. 9.1.x 버전이었다.

gitlab-ctl pg-upgrade

명령으로 업그레이드 해주자! (9.6.1이 됐다)

다시 10으로 업그레이드를 시도했다...

yum -y --nogpgcheck install gitlab-ce-10.0.0-ce.0.el7
gitlab-rake gitlab:check SANITIZE=true

업그레이드 완료!

사실 중간 중간에 configure가 제대로 되지 않거나 restart를 해야되는데 안되서 생기는 문제가 계속 발생했는데 여기엔 적지 않았다..

드디어 3년만에 업그레이드를 했다... 소스에서 옴니버스 버전으로 그리고 다시 업그레이드 하기까지 시간이 많이 걸렸다. 백업 파일 용량이 19GB 인데 백업하거나 복구할때 걸리는 시간이 20~30분이었다. 어쨌든 이제 업그레이드를 수시로 편하게 할 수 있게 됐다!

results matching ""

    No results matching ""